home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
stut_src
/
stu_main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-27
|
49KB
|
1,952 lines
/*
* StuMain.c
*
* Purpose:
* --------
* Gestion du bureau
* - Main()
*
* Gestion des erreurs
* - erreur(): Signale les erreurs fatales
* - erreur_rsrc(): Appelle erreur() avec texte constant
*
* Suggest:
* --------
* Sortir les fonctions de drag&drop vers un module independant
* Il y a des variables privées en G_xxxx -> M_xxx
*
* History:
* --------
* 1993: fplanque: Created
*/
#include "!OPTIONS.H" /* Options de compilation */
#define THIS_FILE "STUMAIN.C v1.00 - 02.95"
/*
* System headers:
*/
#include <stdio.h> /* header standard */
#include <stdlib.h> /* header librairie de fnct std */
#include <string.h> /* header tt de chaines */
#include <aes.h> /* header AES */
#include <vdi.h> /* header VDI */
#include <tos.h> /* Malloc pour ?FREEMEM */
#include <stdarg.h> /* Arguments variables */
/*
* Custom headers:
*/
#include "SPEC_PU.H"
#include "S_MALLOC.H"
#include "AESDEF.H" /* Defs supplmentaires pour gestion AES */
#include "EXFRM_PU.H"
#include "PROGR_PU.H"
#include "ARBKEYPU.H"
#include "ATREE_PU.H"
#include "ARBPG_PU.H"
#include "CONFG_PU.H"
#include "DATAGRPS.H"
#include "DTDIR_PU.H"
#include "DATPG_PU.H"
#include "DBSYS_PU.H"
#include "DEBUG_PU.H"
#include "DESK_PU.H"
#include "FILES_PU.H"
#include "MAIN_PU.H"
#include "MMENU_PU.H"
#include "OBJCT_PU.H"
#include "PGECR_PU.H"
#include "RAMSL_PU.H"
#include "RTERR_PU.H"
#include "SRIAL_PU.H"
#include "SERV_PU.H"
#include "STUT_ONE.RSC\STUT_3.H" /* noms des objets ds le ressource */
#include "TEXT_PU.H"
#include "ACCENTPU.H"
#include "VDI_PU.H"
#include "WIN_PU.H"
#include "WINDR_PU.H"
#include "GEMEV_PU.H"
#include "GEMDIRPU.H"
/* #include "TOSERROR.H" /* Def des erreurs TOS: NON UTILISEES */
/*
* ------------------------ PROTOTYPES -------------------------
*/
/*
* PRIVate INTernal prototypes:
*/
static WIPARAMS * wi_params ( int handle );
static OBJECT * window_clic( WIPARAMS *wi_params_adr, int mouse_x, int mouse_y );
static int drag_icon( int start_x, int start_y, int new_x, int new_y );
static void mouvement( int destination );
static void graf_beginmove( OBJECT *srce_tree, OBJECT *srce_adr, int destination, OBJECT *dest_adr );
static void graf_endmove( OBJECT *srce_tree, int source, OBJECT *srce_adr, int destination, OBJECT *dest_adr );
/*
* ------------------------ VARIABLES -------------------------
*/
/*
* Public variables:
*/
int G_ap_id; /* Identification par l'AES */
unsigned G_version_aes; /* Version AES */
int G_x_mini, G_y_mini; /* Coord sup gauche de l'cran */
int G_w_maxi, G_h_maxi; /* Taille de l'cran de travail */
int G_wx_mini, G_wy_mini; /* Dimensions maximales d'une */
int G_ww_maxi, G_wh_maxi; /* fentre complte */
int G_n_ScreenW, G_n_ScreenH; /* Taille cran */
WIPARAMS *G_wi_list_adr; /* Adresse de l'arbre de paramtres */
int G_top_wi_handle; /* Fentre gre par le programme
la plus en haut, mais pouvant tre
surpasse par un accessoire */
/*
* Paramtres de la "Fentre" dans laquelle
* se trouve la slection actuelle:
*/
WIPARAMS *G_selection_adr = NULL;
int G_ev_mgpbuff[32]; /* Buffer d'venements GEM (normalement, a ne fait que 8 mais bon, a pourrait monter ds prochainesversions AES) */
int G_mouse_x,G_mouse_y; /* Coordonnes souris (Evt_multi) */
int G_mouse_button; /* Etat des boutons (Evt_multi) */
int G_kbd_state; /* Etat des touches spciales... */
int G_kbd_return; /* Scan code touche... */
int G_mouse_nbc; /* Nombre de cliks ... */
int G_fin =0; /* Non nul si G_fin du prg demande */
/*
* Private variables:
*/
/*
* Ressource:
*/
static OBJECT * M_apropos_adr; /* Ptr sur boite d'infos */
/*
* ------------------------ FUNCTIONS -------------------------
*/
/*
* main(-)
*
* Purpose:
* --------
* Programme principal
*
* History:
* --------
* 1992: fplanque: Created
* 25.05.94: chang l'ordre de traitement des messages: ordre dcroissant des bits ds ev_mflags
* 25.05.94: inlus gestion du clavier
* 13.10.94: invers orde d'appel init VDI et dtermination taille cran; contrle d'un taille minimale
* 02.02.95: init arbo APRES init bureau
*/
int main(void)
{
int event; /* Evenements dtects par Evt_multi */
char * ptr;
/*
* Positionnement curseur VT52 en haut de l'cran:
* Passage la ligne automatique:
*/
printf("\33Y!#\33v\n");
/* #define DBGBOOT(x) printf( x ); /* getchar(); */
#define DBGBOOT(x)
DBGBOOT( "Boot-Up Debug is Active\n" )
/*
* test du debug des malloc
*/
ptr = MALLOC( 10 );
ptr = REALLOC( ptr, 20 );
FREE(ptr);
/*
* Init des routines spciales FP:
*/
Special_Init();
/*
* Dclaration du programme l'AES
*/
G_ap_id=appl_init();
if (G_ap_id == -1)
erreur( "[3][L'application courante|"
"ne peut tre dclare|"
"auprs du systme|"
"d'exploitation!]"
"[Quitter|Continuer]");
/*
* Rcupre version AES:
*/
G_version_aes = _GemParBlk .global[ 0 ];
/*
* Init des fonctions de debug:
*/
debug_Construct();
/*
* Transmet nom de l'application l'AES pour le Menu "DESK"
*/
DBGBOOT( "Transmet nom appli l'AES\n" )
if ( G_version_aes >= 0x0400 )
{ /*
* Sous AES 4.0 uniquement:
*/
menu_register( G_ap_id, STUT_REGISTERNAME );
}
/*
* Initialisation "alatoire" du GNA
*****************************************************
* HYPER-MEGA-IMPORTANT: SI VOUS OUBLIEZ DE FAIRE CA,
* LE RESEAU RISQUE DE SE RETROUVER AVEC PLUSIEURS
* MESSAGES AYANT LE MEME NUMERO... DEBROUILLEZ VOUS
* POUR ETRE SUR QUE VOTRE GNA N'EST PAS INITIALISE A
* LA MEME POSITION QUE CHEZ VOTRE VOISIN!!!
*****************************************************
*/
srand( (unsigned int) clock() );
TRACE0( "Initializing modules..." );
/*
* Dtermination de la taille de l'cran
*/
wind_get(0 ,WF_WORKXYWH , &G_x_mini, &G_y_mini, &G_w_maxi, &G_h_maxi);
/*
* Contrle la taille de l'cran:
*/
if( G_x_mini + G_w_maxi < MIN_WIDTH || G_y_mini + G_h_maxi < MIN_HEIGHT )
{
erreur( "[3][|"
"Stut One ne fonctionne|"
"que dans les rsolutions|"
"suprieures ou gales :|"
MIN_RES_STRING ".]"
"[ Quitter ]");
}
/*
* Dtermination de la zone de travail maxi d'une fentre complete:
*/
wind_calc( WC_WORK, COMPLETE, G_x_mini, G_y_mini, G_w_maxi, G_h_maxi,
&G_wx_mini, &G_wy_mini, &G_ww_maxi, &G_wh_maxi );
/*
* Taille cran:
* Pas de -1, sinon on a des trucs genre 639 * 399
*/
G_n_ScreenW = G_x_mini + G_w_maxi;
G_n_ScreenH = G_y_mini + G_h_maxi;
/*
* Ouverture d'une station de travail virtuelle VDI sur cran
*/
DBGBOOT( "Init VDI\n" )
init_vdi();
/*
* Chargement du fichier ressource
*/
DBGBOOT( "Charge RSC\n" )
Dsetpath( "STUT_ONE.RSC" );
if( rsrc_load( "STUT_3.RSC" ) == 0)
{
erreur("[3][|Le fichier RSC|"
"ne peut tre charg!]"
"[Quitter|Continuer]");
}
DBGBOOT( "Charg RSC\n" )
Dsetpath( ".." );
/*
* Dtermination des adresses ressource:
*/
if( rsrc_gaddr( R_TREE, APROPOS, &M_apropos_adr) == 0)
erreur_rsrc();
rsrc_color( M_apropos_adr ); /* Fixe couleurs */
/*
* Fixe nom du logiciel:
*/
dlink_teptext( &M_apropos_adr[PRGNAME], STUT_FULLNAME );
dlink_teptext( &M_apropos_adr[RELEASE], STUT_RELEASEINFO );
/*
* Init traitement des textes:
*/
init_text();
/*
* Init gestion des PopUps:
*/
PopUp_Init();
/*
* Init menu ppal:
*/
DBGBOOT( "Init Main Menu\n" )
init_MainMenu();
/*
* Init prises srie:
*/
DBGBOOT( "Init prises srie\n" )
init_serial();
/*
* Init des oprations sur les fichiers:
*/
DBGBOOT( "Init oprations sur fichiers\n" )
init_fsel();
/*
* Chargement des parametres dans STUT_ver.INI:
*/
autoload_ini();
/*
* Teste si on a charg l'affectation des voies:
*/
if ( G_voies == NULL )
{ /*
* Si on a pas charg d'affectation:
* Cration de voies par dfaut:
*/
init_voies();
}
/*
* Init manip des donnes:
*/
init_datas();
/*
* Init S.G.B.D:
*/
init_dbsystem();
/*
* Init des progress indicators:
*/
init_progress();
/*
* Init du slecteur RAM:
*/
init_ramselect();
/*
* (1) Installation du bureau:
*/
DBGBOOT( "Init Desktop\n" )
init_desktop();
/*
* (2) Init des icnes:
*/
DBGBOOT( "Init Icons\n" )
init_icons();
/*
* Init de l'arbre arborescence:
*/
init_tree();
/*
* Init des pages & routines arbo:
*/
init_arbo();
/*
* Init des objets servant crer des run-time-trees:
*/
init_objects();
/*
* Init accents:
*/
init_accents();
/*
* Init tt des pages cran:
*/
init_PagesEcran();
/*
* Init configuration:
*/
init_config();
/*
* Init dirs:
*/
Dirs_Init();
TRACE0( "Modules' Initialization Completed" );
/*
* Chargement du serveur dans STUT_ver.INF:
*/
autoload_inf();
/*
* Installation du menu
*/
menu_ienable( G_menu_adr, OUVRIR, 0 ); /* Disable */
menu_ienable( G_menu_adr, FERMER, 0 ); /* Disable */
if (menu_bar( G_menu_adr, SHOW_MENU ) == 0)
erreur_rsrc();
/*
* -----------------------
* Gestion des vnements:
* -----------------------
*/
do
{
graf_mouse( ARROW, 0); /* Change curseur souris */
event=evnt_multi( MU_MESAG | MU_BUTTON | MU_KEYBD,
2, 1, 1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
G_ev_mgpbuff,
0, 0,
&G_mouse_x, &G_mouse_y, &G_mouse_button,
&G_kbd_state, &G_kbd_return,
&G_mouse_nbc);
if( event & MU_MESAG )
{ /*
* ------------
* Message AES:
* ------------
*/
int msg_type= G_ev_mgpbuff[0]; /* Type de message */
int wi_handle=-1; /* Handle de la fentre traiter */
WIPARAMS *wi_params_adr; /* Adresse des params de la fen concerne */
if ( msg_type>=WM_REDRAW && msg_type<=WM_NEWTOP ) /* Si event concerne une fentre */
{
wi_handle= G_ev_mgpbuff[3]; /* Handle de la fentre traiter */
wi_params_adr = wi_params ( wi_handle ); /* Adr de la zone de paramtres associe */
if ( wi_params_adr == NULL )
{ /* Si la fen concern n'existe pas(plus) */
msg_type = -1; /* Annule le message: il ne sera pas reconnu par ce qui suit... */
}
}
switch ( msg_type )
{
case MN_SELECTED:
selection_menu( G_ev_mgpbuff[3], G_ev_mgpbuff[4] );
break;
case WM_REDRAW:
redraw( wi_params_adr, G_ev_mgpbuff[4], G_ev_mgpbuff[5],
G_ev_mgpbuff[6], G_ev_mgpbuff[7], TAKE_CTRL ); /* Effectue un redraw */
break;
case WM_TOPPED:
put_wi_on_top( wi_params_adr ); /* Place fen au premier plan */
break;
case WM_CLOSED:
ferme_fenetre( wi_params_adr, TRUE_1 );
break;
case WM_FULLED:
msg_fulled( wi_params_adr );
break;
case WM_ARROWED:
msg_arrowed( wi_params_adr );
break;
case WM_VSLID:
msg_vslid( wi_params_adr );
break;
case WM_HSLID:
msg_hslid( wi_params_adr );
break;
case WM_SIZED:
msg_sized( wi_params_adr );
break;
case WM_MOVED:
msg_moved( wi_params_adr );
break;
case WM_NEWTOP:
ping();
/* Cet vnement n'arrive jamais et c'est dommage! */
put_wi_on_top( wi_params_adr ); /* Place fen au premier plan */
break;
}
}
if( event & MU_BUTTON )
{ /*
* -------------
* Click souris:
* -------------
*/
int wi_handle; /* Handle de la fentre clique */
OBJECT *obj_adr = NULL; /* Pointe sur Objet sur lequel on a cliqu */
WIPARAMS *wi_params_adr; /* Adr des params de la fen ds laquelle on a cliqu */
/* wind_update( BEG_MCTRL ); /* App prend en charge souris */
/* Pourquoi donc ? */
/* 15/07/93 En fait c peut etre justifi pour le drag & drop: */
/* Il ne faudrait pas qu'un fenetre vienne se mettre au premier plan entre */
/* le moment ou on a cliqu et celui o on commence le dplacement! */
/*
* Handle de la fen ds laquelle on a cliqu:
*/
wi_handle= wind_find( G_mouse_x, G_mouse_y );
/*
* Paramtres associs:
*/
wi_params_adr = wi_params( wi_handle );
if ( wi_handle == 0) /* Si on a cliqu sur le bureau */
{
obj_adr = window_clic( G_desk_params_adr, G_mouse_x, G_mouse_y );
}
else /* Si pas cliqu sur le bureau */
{
/*
* Selon le type de fentre:
*/
switch( wi_params_adr -> type )
{ /*
* But: dtecter les fentres "cliquables"
*/
case TYP_TREE:
/*
* Fixe la position de l'arbre pour bien interpreter le clic:
*/
fixform_window( wi_params_adr );
case TYP_ARBO:
case TYP_DIR:
obj_adr = window_clic( wi_params_adr, G_mouse_x, G_mouse_y );
break;
}
}
if ( obj_adr != NULL )
{ /*
* Si un objet est slectionn:
* Type rel sans les bits tendus
*/
int real_type = (obj_adr -> ob_type) & 0x00FF;
/*
* Selon action utilisateur:
*/
if ( G_mouse_nbc==2 )
{ /*
* Si on a double cliqu
*/
if ( obj_adr -> ob_flags & OUVRABLE && !( obj_adr -> ob_state & DISABLED ) )
{ /* ...icne ouvrable */
/* wind_update( END_MCTRL ); /* AES peut reprendre la souris */
/* Forme souris: */
graf_mouse( BUSYBEE, NULL );
/*
* "Ouvre icne":
*/
ouverture();
}
}
else if ( real_type == G_ICON || real_type == G_IMAGE ) /* S'il s'agit d'une icne/image: */
{ /*
* Peut tre un DRAG
*/
int new_bstate, new_x, new_y;
int G_kbd_state, G_kbd_return, G_mouse_nbc; /* Non utiliss */
int destination; /* Objet destination */
/*
* Teste tat des boutons de la souris:
*/
/* Appel de l'AES pdt 1 milliseconde... */
evnt_multi( MU_TIMER,
0, 1, 1, /* 0 Clicks */
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
G_ev_mgpbuff,
1, 0, /* Attend 1 milliseconde! */
&new_x, &new_y, &new_bstate,
&G_kbd_state, &G_kbd_return,
&G_mouse_nbc );
/* Mthode de test par le VDI: a fonctionne mais je */
/* la souponne de bloquer le GEM un moment ou un autre */
/* Je pense qu'il faut viter de mlanger AES et VDI pour la */
/* gestion de la souris... peut tre que cel entrane un */
/* dfaut de mise jour des variables internes de l'AES... */
/* vq_mouse( G_ws_handle, &new_bstate, &new_x, &new_y );*/
/* printf("Boutons: %d \n", new_bstate); */
/* 04/08/93: Je pense avoir rsolu le problme, il provenait */
/* apparemment de la dtection d'objets lorsqu'on sortait du bureau */
/* pour aller dans la barre de menu (a renvoyait -1!) */
/* On devrait pouvoir reprendre la mthode VDI, plus rapide? */
/*
* Teste s'il faut entamer un DRAG:
*/
if ( new_bstate & 1 )
{ /*
* Si bouton gauche press: */
/* Selon le type de fentre: */
switch( wi_params_adr -> type )
{
case TYP_TREE: /* Arborescence */
move_arbo( wi_params_adr, G_mouse_x, G_mouse_y );
break;
default:
destination = drag_icon( G_mouse_x, G_mouse_y, new_x, new_y );
if ( destination != -1 )
mouvement( destination );
}
}
}
}
/* wind_update( END_MCTRL ); /* AES peut reprendre la souris */
}
if( event & MU_KEYBD )
{ /*
* ---------------
* Action clavier:
* ---------------
*/
int n_ScanCode = G_kbd_return >> 8;
char c_car = G_kbd_return & 0xFF;
if( (G_kbd_state & 0xFFFC) == 0
|| ! handle_keypress( G_kbd_state, n_ScanCode, c_car ))
{ /*
* Si Ctrl ou Alt n'taient pas presss
* ou si la combinaison n'a pas t interprte comme raccourci clavier
* La pression s'applique la fentre au top:
*/
WIPARAMS * pWiParams_TopWin = G_wi_list_adr;
if( pWiParams_TopWin != NULL )
{ /*
* Si on a trouv une fentre ouverte (au top):
*/
/* On peut vrifier que c'est la bonne:
* int n_TopWinHandle;
* wind_get( 0, WF_TOP, &n_TopWinHandle );
*/
/* printf( "Top win handle=%d ", G_wi_list_adr -> handle ); */
/*
* Selon le type de donnes dans la fentre:
*/
switch( G_wi_list_adr -> type )
{
case TYP_TEXT:
/*
* Traitement de la touche par l'diteur:
*/
winEdit_ProcessKey( pWiParams_TopWin, G_kbd_state, n_ScanCode, c_car );
break;
}
}
}
}
/*
* Fin ventuelle de la boucle sans fin:
*/
} while( G_fin == 0 );
/*
* -----------------
* Fin du programme:
* -----------------
* Retrait du menu
*/
if (menu_bar(G_menu_adr,CLEAR_MENU) == 0)
erreur_rsrc();
/*
* Referme toutes les fentres
* (normalement c'est dj fait, mais bon.. )
*/
while (G_top_wi_handle != 0)
{ /*
* Tant qu'on a une fentre ouverte
*/
ferme_fenetre( G_wi_list_adr, FALSE0 ); /* On ferme celle du dessus */
}
/*
* Restore prises srie dans leur tat initial:
*/
restore_serial();
/*
* Enlve le bureau de l'application:
*/
clear_desktop();
/*
* Effacement du fichier ressource de la mmoire
*/
if (rsrc_free() == 0)
erreur("[1][ATTENTION: La mmoire|du fichier RSC n'a|pas pu tre libre!][Continuer]");
/*
* Ferme station de travail VDI
*/
v_clsvwk( G_ws_handle );
/*
* Dclaration de fin de programme l'AES
*/
if (appl_exit() == 0)
erreur("[1][ATTENTION: La dclaration|de l'application courante|n'a pas pu tre annule!][Continuer]");
/*
* Affiche stats sur l'utilisation de la mmoire
*/
MEMSTAT();
return 0;
}
/*
* wi_params(-)
*
* Purpose:
* --------
* Recherche ParamBlock d'une fentre
*
* History:
* --------
* fplanque: Created
*/
WIPARAMS* wi_params( int handle )
{
if ( handle == 0 )
{ /* Si on demande les params du bureau: */
return G_desk_params_adr;
}
else
{ /* SI on veut les params d'un fentre= */
WIPARAMS *wi_params_adr;
/* On commence par le haut de la liste */
wi_params_adr=G_wi_list_adr;
while ( wi_params_adr != NULL && (wi_params_adr -> handle) != handle )
{ /* Tant qu'on pointe pas sur la fen recherche */
wi_params_adr = wi_params_adr -> next; /* Nlle fentre tester */
}
return wi_params_adr;
/* Il peut arriver qu'on reoive un message alors que la fenetre */
/* a t referme, dans ce cas, cette fonction renvoie un pointeur NULL */
}
}
/*
* window_clic(-)
*
* Purpose:
* --------
* Entreprend action lorsqu'on a cliqu
* dans une fentre ou sur le bureau
*
* History:
* --------
* 1993: fplanque: Created
* 29.08.94: Gestion de l'item menu "Dcompile"
* 20.09.94: Gestion du menu RENAME; remodelage substanciel; correction bug sur dtection TYPE d'une icne ARBO
* 02.02.95: corrction bug: renvoie maintenant NULL si objet cliqu est disabled
*/
OBJECT * window_clic(
WIPARAMS * wi_params_adr,
int G_mouse_x,
int G_mouse_y )
{
/*
* Adr de la fenetre dans laquelle est (plus pour longtemps) slectionne l'ancienne icone:
*/
WIPARAMS *old_selection_adr = G_selection_adr;
/*
* No de l'icne dj slectionne ds cette "fentre":
*/
int selected_icon = wi_params_adr -> selected_icon;
/*
* Adresse de l'arbre d'objets test:
*/
OBJECT *tree_adr = wi_params_adr -> draw_ptr .tree;
/*
* Trouve no de l'objet sur lequel on a cliqu:
*/
int object= objc_find( tree_adr, 0, 5, G_mouse_x, G_mouse_y );
/*
* Pointeur sur cet objet:
*/
OBJECT *obj_adr = &( tree_adr[object] );
/*
* Coordonnes zone de travail concerne
*/
int wx, wy, ww, wh;
/*
* Vrifie qu'on est dans la zone de travail de la fentre et que ce n'est
* pas l'AES qui n'a pas ragi lorsqu'on clique sur les boutons de la
* fentre (a arrive... souvent...)
*/
wind_get( wi_params_adr -> handle, WF_WORKXYWH, &wx, &wy, &ww, &wh );
if ( G_mouse_x < wx || G_mouse_x >= wx+ww || G_mouse_y < wy || G_mouse_y >= wy + wh )
{
return NULL; /* Ce clic est NUL! */
}
/*
* Cas d'une icne: vrifie qu'on est sur l'image ou le texte...
*/
if ( ((obj_adr -> ob_type) & 0x00FF) == G_ICON )
{
if ( !ctrl_icon( tree_adr, object, G_mouse_x, G_mouse_y ) )
{ /*
* Si on seulement cliqu PRES d'une icne:
*/
object = objc_parent( tree_adr, object );
obj_adr = &( tree_adr[object] );
}
}
/*
* Vrifie s'il se passe quelque chose:
* CaD si on ne reclique pas sur la meme icne que celle dj slectionne:
*/
if( object != selected_icon || object == 0 )
{ /*
* Il va se passer quelque chose: dselection et/ou slection:
*/
/************************************/
/* Dslection de l'ancienne icne: */
/************************************/
if ( old_selection_adr != NULL )
{ /*
* S'il y a dj une icne slectionne qque part:
*/
OBJECT *old_tree = old_selection_adr -> draw_ptr.tree; /* Atbre dans lequel se trouvait l'ancienne icne slectionne */
int icon = old_selection_adr -> selected_icon;
int start_obj; /* Objet de dbut du raffichage */
/* printf( "unsel "); */
/*
* Teste partir de o il faut rafficher:
*/
if ( G_cnf_cope_with_ltf == TRUE_1 /* Si on veut contourner les bugs de let'm fly */
|| old_tree[icon] .ob_type == G_IMAGE ) /* S'il s'agit d'une IMAGE */
{ /*
* S'il faut rafficher l'objet en dessous de celui qui nousintresse:
*/
start_obj = objc_parent( old_tree, icon ); /* On va aussi redessiner le parent sous l'icone */
}
else
{
start_obj = icon; /* On ne redssine que l'icne elle mme */
}
/*
* Raffiche icne dans son nouvel tat (dslection):
*/
modif_icon( old_selection_adr, start_obj, icon, NORMAL, TAKE_CTRL ); /* Dslectionne l'ancienne icne */
old_selection_adr -> selected_icon = 0; /* Plus d'icone slectionne */
}
/*
* **********************************
* Slection d'une nouvelle icne:
* **********************************
*/
if( obj_adr -> ob_flags & SELECTABLE && !(obj_adr -> ob_state & DISABLED) )
{ /*
* Si objet slectionnable:
*/
int n_compile = 0; /* A priori, on ne peut pas dcompiler l'objet slectionn */
int n_rename = 0; /* A priori, on ne peut pas renommer l'objet slectionn */
int start_obj; /* Objet de dbut du raffichage */
/* printf( "select "); */
selected_icon = object; /* Nouvelle icne active */
if ( G_cnf_cope_with_ltf == TRUE_1 )
{ /*
* Si on veut contourner les bugs de let'm fly:
*/
start_obj = objc_parent( tree_adr, selected_icon ); /* On va aussi redessiner le parent sous l'icone */
}
else
{
start_obj = selected_icon; /* On ne redssine que l'icne elle mme */
}
/*
* Modifie l'icne:
*/
modif_icon( wi_params_adr, start_obj, selected_icon, SELECTED, TAKE_CTRL); /* Slectionne la nouvelle icne: */
G_selection_adr = wi_params_adr; /* VAR globale: Nlle "fen" contenant la slection */
/*
* Sauvegarde icone selectionne:
*/
wi_params_adr -> selected_icon = selected_icon;
/*
* Disable/enable options du menu OUVRIR, Paramtres
* ET Change ligne d'infos de la fenetre:
*/
menu_ienable( G_menu_adr, OUVRIR, (obj_adr -> ob_flags & OUVRABLE)? 1:0 );
menu_ienable( G_menu_adr, PARAMETR, (obj_adr -> ob_flags & PARAM)? 1:0);
switch( wi_params_adr -> class )
{
case CLASS_DIR: /* Directory */
{ /*
* Si on a slectionn un objet dans un directory:
*/
DATAPAGE * pDataPage = page_adr_byicno( G_selection_adr -> datadir, selected_icon );
n_rename = 1; /* On pourra renommer l'objet en question */
if( pDataPage != NULL && pDataPage -> DataType == DTYP_PAGES )
{ /*
* Si on a slectionn une page cran:
* On pourra la dcompiler:
*/
n_compile = 1; /* Enable menu Dcompiler */
}
set_infoline( wi_params_adr, dir_infoline_selection ); /* Modifie ligne d'infos */
}
break;
case CLASS_TREE: /* Arborescence */
if( ((obj_adr -> ob_type) & 0x00FF) == G_ICON )
{ /*
* Si on a slectionn une page et non pas un lien:
* On pourra renommer l'objet en question
*/
n_rename = 1;
}
/* printf( "infoline..."); */
set_infoline( wi_params_adr, arbo_infoline_selection ); /* Modifie ligne d'infos */
/* printf( "ok" ); */
break;
}
menu_ienable( G_menu_adr, RENAME, n_rename);
menu_ienable( G_menu_adr, MENDECMP, n_compile);
}
else
{ /*
* Si pas d'icne slectionne (juste une Dslection)
*/
wi_params_adr -> selected_icon = 0; /* Pas d'icne active */
G_selection_adr = NULL; /* VAR globale: Plus de slection */
menu_ienable( G_menu_adr, OUVRIR, 0); /* Disable menu OUVRIR */
menu_ienable( G_menu_adr, RENAME, 0); /* Disable menu RENOMMER */
menu_ienable( G_menu_adr, MENDECMP, 0); /* Disable menu Dcompiler */
menu_ienable( G_menu_adr, PARAMETR, 0); /* Disable menu "Paramtres" */
}
/*
* Modifie la ligne d'infos de la fen qui contenait la slection prcdente:
*/
if ( old_selection_adr != NULL /* S'il y avait un slection */
&& old_selection_adr != G_selection_adr ) /* et dans une autre fen^etre que la nouvelle slection */
{
/*
* Restaure la ligne d'infos gnrales:
*/
switch( old_selection_adr -> class )
{
case CLASS_DIR: /* Directory */
set_infoline( old_selection_adr, dir_infoline ); /* Modifie ligne d'infos */
break;
case CLASS_TREE: /* Arborescence */
set_infoline( old_selection_adr, arbo_infoline ); /* Modifie ligne d'infos */
break;
}
}
}
/*
* Renvoie l'adresse de l'objet slectionn:
*/
if( obj_adr -> ob_flags & SELECTABLE && !(obj_adr -> ob_state & DISABLED) )
{ /*
* Si objet slectionnable:
*/
return obj_adr;
}
else
{ /*
* Si pas slectionnable:
*/
return NULL; /* Aucun objet slectionn */
}
}
/*
* ouverture(-)
*
* Purpose:
* --------
* 'Ouverture' d'une icne
*
* History:
* --------
* 1993: fplanque: Created
* 22.11.94: teste si selection avant d'agir
* 12.11.94: Signale SSTATE_MODIFIED pour pages cran et bases de donnes
*/
void ouverture( void )
{
int selected_object;
if( G_selection_adr == NULL )
{
ping();
return;
}
/*
* No de l'objet slectionn:
*/
selected_object = G_selection_adr -> selected_icon;
switch( G_selection_adr -> type ) /* Selon le type de fentre */
{
case TYP_DESK:
{
/*
* Numro du datagroup concern par l'ouverture:
*/
DATAGROUP *datagroup = dgroup_adr_byiconno( selected_object );
/*
* On va se placer dans le Dir ppal du datagroup ouvrir:
*/
DATADIR *datadir = datagroup -> root_dir;
switch ( selected_object )
{
case DSTDISK:
/*
* Cette action permet de charger un texte et
* de l'afficher directement!
*/
ouvre_fenetre( CLASS_TEXT, TYP_TEXT,
NULL, NULL, NULL,
" Texte " );
break;
case DSTARBO:
ouvre_fenetre( CLASS_TREE, TYP_TREE,
datagroup, datadir, NULL,
" Arborescence " );
break;
case DSTPAGES:
ouvre_fenetre( CLASS_DIR, TYP_DIR,
datagroup, datadir, NULL,
" Pages Ecran " );
break;
case DSTDATAS:
ouvre_fenetre( CLASS_DIR, TYP_DIR,
datagroup, datadir, NULL,
" Bases de Donnes " );
break;
case DSTTEXTS:
ouvre_fenetre( CLASS_DIR, TYP_DIR,
datagroup, datadir, NULL,
" Textes " );
break;
case DSTPICS:
ouvre_fenetre( CLASS_DIR, TYP_DIR,
datagroup, datadir, NULL,
" Images " );
break;
default: /* Si on a pas pu traiter la demande */
ping(); /* Emmet un bip */
}
break;
}
case TYP_ARBO:
{ /*
* Sommaire d'une page arbo:
*/
ouverture_menu_arbo( G_selection_adr );
break;
}
case TYP_DIR:
{ /*
* Groupe de donnes concern:
*/
DATADIR * curr_datadir = G_selection_adr -> datadir;
DATAGROUP * datagroup = G_selection_adr -> datagroup;
DATAPAGE * datapage = page_adr_byicno( curr_datadir, selected_object );
switch( datagroup -> DataType )
{
case DTYP_PAGES:
case DTYP_DATAS:
{ /*
* Pages cran:
* Bases de donnes:
* Edition du commentaire
*/
GRECT GRect = { 0, 0, 0, 0 };
if( edit_datapage_comment( datapage, &GRect ) )
{ /*
* Si on a modifi le commentaire:
* Signale que la page a t modifie:
*/
dataPage_chgSavState( datapage, SSTATE_MODIFIED, TRUE_1, TRUE_1 );
}
break;
}
case DTYP_TEXTS:
ouvre_fenetre( CLASS_DATAPAGE, TYP_TEXT,
datagroup, curr_datadir, datapage,
"" );
break;
case DTYP_PICS:
ouvre_fenetre( CLASS_DATAPAGE, TYP_PI3,
datagroup, curr_datadir, datapage,
"" );
break;
default:
signale("Type de donnes de la fentre non reconnu");
}
break;
}
case TYP_TREE:
{ /*
* Arborescence
*/
ouverture_page_arbo( G_selection_adr );
break;
}
default:
ping();
}
/*
* Dslectionne l'icne qu'on vient d' "ouvrir" :
*/
{
OBJECT *tree = G_selection_adr -> draw_ptr.tree;
int start_obj;
/*
* Teste partir de o il faut rafficher:
*/
if ( G_cnf_cope_with_ltf == TRUE_1 /* Si on veut contourner les bugs de let'm fly */
|| tree[selected_object] .ob_type == G_IMAGE ) /* S'il s'agit d'une IMAGE */
{ /*
* S'il faut rafficher l'objet en dessous
* de celui qui nous intresse:
*/
start_obj = objc_parent( tree, selected_object ); /* On va aussi redessiner le parent sous l'icone */
}
else
{
start_obj = selected_object; /* On ne redssine que l'icne elle mme */
}
/*
* Raffiche:
*/
modif_icon( G_selection_adr, start_obj, selected_object, NORMAL, TAKE_CTRL );
no_selection(); /* Reset des flags */
}
}
/*
* sauver(-)
*
* Purpose:
* --------
* 'Sauvegarde' d'une icne ou du contenu d'une fentre
* sur le disque
*
* Suggest:
* ------
* On devrait pouvoir sauver les debug text etc...
*
* History:
* --------
* 31.05.94: fplanque: Created
*/
void sauver( void )
{
/*
* teste s'il y a une slection:
*/
if( G_selection_adr == NULL )
{ /*
* Pas de slection:
* On va sauver le contenu de la fentre au 1er plan:
*/
if( G_wi_list_adr != NULL )
{ /*
* S'il y a une fentre au premier plan
*/
switch ( G_wi_list_adr -> type ) /* Selon le type de fentre */
{
case TYP_TEXT:
sauve_texte( G_wi_list_adr -> content_ptr.textInfo );
break;
default:
signale("Ne sait pas sauver le contenu de cette fentre" );
}
}
}
}
/*
* parametrage(-)
*
* Purpose:
* --------
* 'Paramtrage' d'une icne
*
* History:
* --------
* fplanque: Created
*/
void parametrage ( const GRECT *start_box )
{
/* No de l'objet slectionn: */
int selected_object = G_selection_adr -> selected_icon;
/* printf("Type de fentre: %X ",G_selection_adr -> type); */
switch ( G_selection_adr -> type ) /* Selon le type de fentre */
{
case TYP_DESK:
{
switch ( selected_object )
{
case DSTTERM:
/*
* Paramtrage Terminla:
*/
param_term( start_box );
break;
default: /* Si on a pas pu traiter la demande */
ping(); /* Emmet un bip */
}
break;
}
default:
ping();
}
}
/*
* no_selection(-)
*
* Purpose:
* --------
* Supprime toute slection d'icne au niveau
* des flags (pas d'affichage)
*
* History:
* --------
* 1993: fplanque: Created
*/
void no_selection( void )
{
menu_ienable( G_menu_adr, OUVRIR, 0); /* Disable "Ouvrir" */
menu_ienable( G_menu_adr, RENAME, 0); /* Disable "Renommer" */
menu_ienable( G_menu_adr, PARAMETR, 0); /* Disable "Paramtres" */
G_selection_adr -> selected_icon= 0; /* Plus d'icne slectionne */
G_selection_adr = NULL ; /* Plus de fen o se trouve select */
}
/*
* drag_icon(-)
*
* Purpose:
* --------
* Dplacement d'une icne
*
* History:
* --------
* 1993: fplanque: Created
* 17.06.94: teste 'OVERLAPPED' plutt que WF_TOP
*/
int drag_icon(
int start_x,
int start_y,
int n_new_x,
int n_new_y )
{
int n_drag_evt; /* Evnement qui s'est dclench: */
int n_new_bstate, n_kbd_state, n_kbd_return, n_mouse_nbc; /* Non utiliss */
int i,j;
int start_obj=-1, sel_x, sel_y; /* Objet de dpart avec coordonnes */
int offset_x , offset_y;
int fantome_x, fantome_y;
int area_x1, area_y1, area_x2, area_y2; /* Zone de dplacement du fantme */
int n_new_handle; /* Handle de la "fentre" o se trouve actuellement la souris */
int last_spot=-1; /* Dernier objet que l'on avait "allum" */
/*
* Simule "construction cran" pour empcher l'AES de drouler ses menus:
* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
*/
start_WINDRAW( NULL );
/*
* Forme souris:
*/
graf_mouse( FLAT_HAND, NULL ); /* Main ouverte */
/*
* Calcule la zone ds laquelle peut se dplacer le fantme:
*/
area_x1 = G_x_mini;
area_y1 = G_y_mini;
area_x2 = G_x_mini + G_w_maxi - G_icon_w;
area_y2 = G_y_mini + G_h_maxi - G_icon_h;
/* Calcule offset entre icne-start et pointeur de la souris: */
objc_offset( G_selection_adr -> draw_ptr.tree,
G_selection_adr -> selected_icon, &sel_x, &sel_y );
offset_x = sel_x - start_x;
offset_y = sel_y - start_y;
/* Objet de dpart: (slt si sur desktop) */
if ( G_selection_adr == G_desk_params_adr )
start_obj = G_selection_adr -> selected_icon;
/* Fixe les paramtres de dessin VDI: */
vsl_color( G_ws_handle, RED ); /* Couleur */
vswr_mode( G_ws_handle, MD_XOR ); /* Mode XOR */
vsl_type( G_ws_handle, 7 ); /* Motif utilisateur */
/*
* Boucle de mouvement:
*/
do
{ /*
* Cherche sur quoi se trouve le pointeur de la souris:
*/
n_new_handle = wind_find( n_new_x, n_new_y );
if ( n_new_handle == 0)
{ /*
* Si on est sur le bureau:
*/
sensitive_desk( n_new_x, n_new_y, start_obj, &last_spot );
}
/* else /* Si pas sur desktop: */
/* printf("WIN:%d \r",n_new_handle);*/
/*
* Coordonnes auxquelles il faut dessiner le fantme:
*/
fantome_x = n_new_x + offset_x;
if ( fantome_x < area_x1 )
{
fantome_x = area_x1;
}
else if ( fantome_x > area_x2 )
{
fantome_x = area_x2;
}
fantome_y = n_new_y + offset_y;
if ( fantome_y < area_y1 )
{
fantome_y = area_y1;
}
else if ( fantome_y > area_y2 )
{
fantome_y = area_y2;
}
for( i=1, j=0; i<=9; i++ )
{
G_pxyarray[ j ]= fantome_x + G_fantome_icone[ j++ ];
G_pxyarray[ j ]= fantome_y + G_fantome_icone[ j++ ];
}
/*
* Dessin du fantme de l'icne:
*/
draw_fantom( fantome_x, fantome_y );
/*
* Attend qu'il se passe qque chose:
*/
n_drag_evt=evnt_multi( MU_BUTTON | MU_M1,
1, 1, 0, /* Observe le relachement du bouton gauche */
1, n_new_x, n_new_y, 1, 1, /* Observe tout dplacement de la souris */
0, 0, 0, 0, 0,
0L,
0, 0,
&n_new_x, &n_new_y, &n_new_bstate,
&n_kbd_state, &n_kbd_return,
&n_mouse_nbc);
/*
* Efface le fantme de l'icne:
*/
draw_fantom( fantome_x, fantome_y );
} while( n_drag_evt != MU_BUTTON );
/*
* Il faut remettre en place certains attributs de dessin:
*/
vswr_mode( G_ws_handle, MD_REPLACE ); /* FIN Mode XOR */
/*
* Dslectionne l'icne destination:
*/
if ( last_spot != -1 )
{
modif_icon( G_desk_params_adr, last_spot, last_spot, NORMAL, CTRL_OK ); /* DSlectionne */
}
/*
* Fin du drag
*/
graf_mouse(BUSYBEE, 0); /* Change curseur souris */
end_WINDRAW();
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
/*
* No de l'objet sur lequel on a tir l'icne de dpart
* -1 si aucune ou si last=start
*/
return last_spot;
}
/*
* mouvement(-)
*
* Purpose:
* --------
* 'Mouvement' d'une icne vers une autre
*
* History:
* --------
* 1993: fplanque: Created
* 19.06.94: gestion des groupes textes & images
* 09.08.94: plus de redraw apres efface_1page ni aprs DataGrp_MergeFile, il devrait dej etre fait ds subroutine
* 26.12.94: ectraction du reset datagroup
*/
void mouvement( int destination )
{
int resultat = 0; /* Rsultat de l'opration */
int n_SrcIcon = G_selection_adr -> selected_icon; /* Icne de dpart */
/*
* Adr icnes source & dest:
*/
OBJECT *srce_tree = (G_selection_adr -> draw_ptr).tree;
OBJECT *srce_adr = &(G_selection_adr -> draw_ptr).tree[ n_SrcIcon ];
OBJECT *dest_adr = &G_desktop_adr[ destination ];
switch ( G_selection_adr -> class )
{
case CLASS_DESK:
/*
* Dpart: Bureau
*/
switch ( n_SrcIcon )
{
case DSTDISK:
{ /*
* Dpart: DISQUE
*/
switch ( destination )
{
case DSTARBO: /* Destination arbo */
{
DATAGROUP *datagroup = dgroup_adr_byiconno( destination );
if( (datagroup -> root_dir) == NULL )
{ /*
* Si arbo vierge: ok
*/
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
resultat= DataGrp_MergeFile( datagroup );
}
else
{ /*
* Si l'arbo est dj occuppe:
*/
form_alert(1,"[1][|Vous ne pouvez charger|"
"une arborescence que|"
"dans un dossier vierge!]"
"[ Abandon ]");
resultat = 1;
}
break;
}
case DSTPAGES: /* Destination pages cran */
case DSTDATAS: /* Destination Donnes */
case DSTTEXTS: /* Destination textes */
case DSTPICS: /* Destination images */
{
DATAGROUP *datagroup = dgroup_adr_byiconno( destination );
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
resultat= DataGrp_MergeFile( datagroup );
break;
}
}
if ( resultat>1 )
{ /*
* Si le chargement s'est effectu
*/
graf_endmove( srce_tree, n_SrcIcon, srce_adr, destination, dest_adr );
}
break;
}
case DSTARBO: /* Dpart: ARBO */
case DSTPAGES: /* Dpart: PAGES */
case DSTDATAS: /* Dpart: donnes */
case DSTTEXTS: /* Dpart: textes */
case DSTPICS: /* Dpart: images */
{ /*
* Dpart: un DATAGROUP:
* Numro du datagroup concern:
*/
DATAGROUP *datagroup = dgroup_adr_byiconno( n_SrcIcon );
/*
* Etat du groupe:
*/
SSTATE sstate_dgrp = dataGroup_getSavState( datagroup );
/*
* Selon la destintaion:
*/
switch ( destination )
{
case DSTTRASH:
/*
* Destination: CORBEILLE
* RESET du DataGroup:
*/
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
if( DataGrp_Reset( datagroup ) )
{ /*
* Si on a supprim:
*/
graf_endmove( srce_tree, n_SrcIcon, srce_adr, destination, dest_adr );
}
else
{ /*
* Dslectionne l'icne (source) qu'on vient de traiter :
*/
modif_icon( G_selection_adr, n_SrcIcon, n_SrcIcon, NORMAL, TAKE_CTRL );
}
no_selection();
resultat=1;
break;
case DSTDISK:
{ /*
* Destination: DISQUE
* Sauvegarde des donnes d'un groupe:
* Dbut effet graphique:
*/
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
/*
* Si le datagroup n'est pas vierge:
*/
if( sstate_dgrp != SSTATE_EMPTY )
{ /*
* Sauvegarde:
*/
resultat= sauve_DataGroup( dgroup_adr_byiconno( n_SrcIcon ) );
/*
* Fin effet graphique:
*/
if ( resultat > 0 )
{
graf_endmove( srce_tree, n_SrcIcon, srce_adr, destination, dest_adr );
}
}
resultat = 1;
}
}
break;
}
}
break;
case CLASS_DIR:
{ /*
* Dpart: un directory de zone de donnes
*/
DATAGROUP * curr_datagroup = G_selection_adr -> datagroup;
DATADIR * curr_datadir = G_selection_adr -> datadir;
DATAPAGE * pDataPage = page_adr_byicno( curr_datadir, n_SrcIcon );
DATATYPE data_type = curr_datagroup -> DataType; /* Type de donnes */
if( pDataPage == NULL )
{ /*
* Si pas de page associe l'icne:
*/
signale( "Pas de Datapage associe" );
break;
}
switch ( destination )
{
case DSTDISK:
{ /*
* Sauve page indpendante sur disque:
*/
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
sauve_DataPage( curr_datadir, pDataPage );
resultat=1;
}
break;
case DSTTERM: /* Destination terminal */
if ( data_type == DTYP_PAGES )
{ /*
* S'il s'agit de pages cran:
*/
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
visu_page( pDataPage, NULL ); /* Visu page */
resultat=1;
}
break;
case DSTTRASH: /* Destination poubelle! */
{
/*
* Effet graphique:
*/
graf_beginmove( srce_tree, srce_adr, destination, dest_adr );
/*
* Demande conf et efface:
*/
resultat = ( efface_1data( curr_datadir, pDataPage ) )
? 2 : 1;
if ( resultat > 1 )
{ /*
* Si on a confirm la suppression:
*/
/* Bote en mouvement: */
graf_movebox(
srce_adr -> ob_width, srce_adr -> ob_height, /* Dimensions bote */
srce_adr -> ob_x + srce_tree -> ob_x, srce_adr -> ob_y + srce_tree -> ob_y, /* Coord dpart */
dest_adr -> ob_x + G_x_mini, dest_adr -> ob_y + G_y_mini ); /* Coord dest */
/*
* Plus d'icne slectionne:
*/
no_selection();
/*
* Dslectionne destination:
*/
modif_icon( G_desk_params_adr, destination, destination, NORMAL, TAKE_CTRL );
}
break;
}
}
break;
}
}
switch( resultat )
{
case 0: /* Op impossible */
alert( PERR_IMPOSSIBLE_OP ); /* Opration impossible */
break;
case 1: /* No comment on operation */
/*
* Dslectionne destination:
*/
modif_icon( G_desk_params_adr, destination, destination, NORMAL, TAKE_CTRL );
break;
}
}
/*
* graf_beginmove(-)
*
* Purpose:
* --------
* Dbut d'un mouvement d'icne
*
* History:
* --------
* 1993: fplanque: Created
*/
void graf_beginmove( OBJECT *srce_tree, OBJECT *srce_adr, int destination, OBJECT *dest_adr )
{
/* Bote en mouvement: */
graf_movebox(
srce_adr -> ob_width, srce_adr -> ob_height, /* Dimensions bote */
srce_adr -> ob_x + srce_tree -> ob_x, srce_adr -> ob_y + srce_tree -> ob_y, /* Coord dpart */
dest_adr -> ob_x + G_x_mini, dest_adr -> ob_y + G_y_mini ); /* Coord dest */
/* Slectionne destination: */
modif_icon( G_desk_params_adr, destination, destination, SELECTED, TAKE_CTRL );
}
/*
* graf_endmove(-)
*
* Purpose:
* --------
* Fin d'un mouvement d'icne complet
*
* History:
* --------
* fplanque: Created
*/
void graf_endmove(
OBJECT *srce_tree,
int n_SrcIcon,
OBJECT *srce_adr,
int destination,
OBJECT *dest_adr )
{
/* Dslectionne l'icne (n_SrcIcon) qu'on vient de traiter : */
modif_icon( G_selection_adr, n_SrcIcon, n_SrcIcon, NORMAL, TAKE_CTRL );
/* Bote en mouvement: */
graf_movebox(
srce_adr -> ob_width, srce_adr -> ob_height, /* Dimensions bote */
srce_adr -> ob_x + srce_tree -> ob_x, srce_adr -> ob_y + srce_tree -> ob_y, /* Coord dpart */
dest_adr -> ob_x + G_x_mini, dest_adr -> ob_y + G_y_mini ); /* Coord dest */
/* Slectionne icne destination en mmoire: */
G_selection_adr = G_desk_params_adr;
G_selection_adr -> selected_icon = destination;
/* Disable/enable menu OUVRIR */
menu_ienable( G_menu_adr, OUVRIR, ( G_desktop_adr[ destination ] .ob_flags & OUVRABLE ));
}
/*
* apropos(-)
*
* Purpose:
* --------
* Affichage boite d'infos
*
* History:
* --------
* 1993:fplanque: Created
*/
void apropos( const GRECT *start_box )
{
int exit_obj; /* Objet de sortie */
GRECT form_box; /* Dimensions du formulaire */
int edit = 0; /* Bidon */
/* App prend en charge souris */
WIND_UPDATE_BEG_MCTRL
open_dialog( M_apropos_adr, start_box, &form_box );
exit_obj=ext_form_do( M_apropos_adr, &edit); /* Gestion de la bote */
close_dialog( M_apropos_adr, exit_obj, start_box, &form_box );
/* AES peut reprendre la souris */
WIND_UPDATE_END_MCTRL
}
/*
* main_quitter(-)
*
* Purpose:
* --------
* Appell Lorsque l'utilisateur veut quitter
* Ferme les fenetres avec demande de confirmation si contenu modifi
* Contrle si tout est sauv et le cas chant, demande s'il faut sauver
* et finalement sauve hh :)
*
* History:
* --------
* 02.10.94: fplanque: Created
* 07.01.95: ferme les fenetres avant de proposer de sauver les groupes, en effet lors de la fermeture d'une fenetre on peut modifier un groupe!
*/
BOOL main_quitter( void ) /* Out: TRUE si on autorise quitter */
{
while (G_top_wi_handle != 0)
{ /*
* Tant qu'on a une fentre ouverte
* On ferme celle du dessus
*/
if( ! ferme_fenetre( G_wi_list_adr, TRUE_1 ) )
{ /*
* On ne quitte pas!
*/
return FALSE0;
}
}
if( get_ServSState() == SSTATE_MODIFIED )
{ /*
* Le serveur a t modifi depuis dernire sauvegarde:
*/
do
{
switch( alert( DLG_SAVE_QUIT ) )
{
case 1:
DataGroups_SaveAll();
break;
case 2:
return TRUE_1;
case 3:
return FALSE0;
}
/*
* Si tout n'a pas t sauv, on va reposer la question fatidique!
*/
} while ( get_ServSState() == SSTATE_MODIFIED );
return TRUE_1;
}
else
{ /*
* Tous les fichiers en RAM sont sauvs:
*/
if( alert( DLG_QUIT ) == 1 )
{
return TRUE_1;
}
}
/*
* On ne quitte pas!
*/
return FALSE0;
}